package org.example.project.search.data

import kotlin.math.max
import kotlin.math.min


/**
 * 表示一个经纬度
 */
class LatLng {
    /**
     * 纬度
     */
    var latitude: Double = 0.0

    /**
     * 经度
     */
    var longitude: Double = 0.0

    var altitude: Double = 0.0

    constructor()

    /**
     * 构造一个 [LatLng] 对象
     *
     * @param lat 纬度
     * @param lon 经度
     */
    constructor(lat: Double, lon: Double) {
        longitude = if (-180.0 <= lon && lon < 180.0) {
            lon
        } else {
            ((lon - 180.0) % 360.0 + 360.0) % 360.0 - 180.0
        }
        latitude = max(-90.0, min(90.0, lat))
    }

    /**
     * 构造一个 [LatLng] 对象
     *
     * @param lat 纬度
     * @param lon 经度
     */
    constructor(lat: Int, lon: Int) {
        latitude = lat.toDouble()
        longitude = lon.toDouble()
    }


    override fun hashCode(): Int {
        var i = 1
        var l: Long = latitude.toLong()
        i = 31 * i + (l xor (l ushr 32)).toInt()
        l = longitude.toLong()
        i = 31 * i + (l xor (l ushr 32)).toInt()
        l = altitude.toLong()
        i = 31 * i + (l xor (l ushr 32)).toInt()
        return i
    }

    override fun equals(obj: Any?): Boolean {
        if (this === obj) {
            return true
        }
        if (obj !is LatLng) {
            return false
        } else {
            return this.hashCode() == obj.hashCode()
        }
    }

    override fun toString(): String {
        return "LatLng[latitude=$latitude,longitude=$longitude]"
    }
}